package 线程同步;
/*
* 1.同步方法：就是把synchronized关键字加到方法上
* 修饰符 synchronized 返回值类型 方法名(方法参数){
*    方法体
* }
* 同步方法锁对象是什么？
* this
* 2.静态同步方法:就是把synchronized关键字加到静态方法上
* 同步静态方法的锁对象是什么？
* 类名.class
* */
public class 同步方法解决数据安全问题 {
    public static void main(String[] args) {
        SellTicket3 st = new SellTicket3();
        Thread t1 = new Thread(st, "窗口1");
        Thread t2 = new Thread(st, "窗口2");
        Thread t3 = new Thread(st, "窗口3");
        t1.start();
        t2.start();
        t3.start();
    }
}
class SellTicket3 implements Runnable{
    private static int tickets=100;
    private int x=0;
    @Override
    public void run() {
        while (true){
            sellTicket();
        }
    }
    /*同步方法*/
//    private synchronized void sellTicket(){
//        if(tickets>0){
//            try {
//                Thread.sleep(100);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");
//            tickets--;
//        }
//    }
    /*静态同步方法演示*/
    private static synchronized void sellTicket(){
        if(tickets>0){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");
            tickets--;
        }
    }
}